package client;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import DTO.ResumeAnnonceDTO;

/**
 * 
 * Classe contenant l'accueil de notre programme (après la page de démarage).
 * 
 * @author Julien Dubois
 * @version 1.0 (Avril 2012)
 */


@SuppressWarnings("serial")
public class ClientFenetreAccueil extends JFrame implements ActionListener, WindowListener
{

	//DECLARATION DES VARIABLES DE LA CLASSE 
	
	/**
	 * Panel général de fond.
	 */
	private JPanel grandPanel ;
	
	/**
	 * Panel principal contenant nos éléments.
	 */
	private JPanel panel;
	
	/**
	 * Layouts choisis pour agencer nos éléments.
	 */
	private BorderLayout borderLayoutPrincipal;
	private FlowLayout flowLayout;
	private GridLayout gridLayoutAnnonces;
	
	/**
	 * Les bouton's de la fenêtre.
	 */
	private JButton seConnecter, creeUnCompte ;
	
	/**
	 * ComboBox de la fenêtre.
	 */
	@SuppressWarnings("rawtypes")
	private JComboBox combo;
	
	/**
	 * Label's de notre fenêtre.
	 */
	private JLabel erreurLoginPassword, compteSuppr;
	
	/**
	 * TextField de notre fenêtre.
	 */
	private JTextField textArea;
	
	/**
	 * PasswordField de notre fenêtre.
	 */
	private JPasswordField passwordArea;

	/**
	 * Panel utile pour l'affichage des annonces en rapport avec le vendeur.
	 */
	private JPanel panelIntermediaire ;
	
	/**
	 * ScrollPane pour avoir la scrollBar.
	 */
	private JScrollPane scrollPanel ;
	
	/**
	 * Booleen de notre fenêtre.
	 */
	//le booleen quitter sert à assurer proprement la fermeture de la connexion avec le serveur. 
	private boolean quitter = true;
	

	//les variables static ci-dessous, sont static car il faut pouvoir s'en rapeller quand on rafraichit la fenêtre.
	/**
	 * String de la fenêtre.
	 */
	private static String tri = "" ;
	
	/**
	 * Liste's de notre fenêtre.
	 */
	private List<ResumeAnnonceDTO> listeAnnonces = null ;
	
	/**
	 * Booleens de la fenêtre;
	 */
	private static boolean triage_annonnce_objet = false  ;
	private static boolean triage_annonce_emploi = false ;
	private static boolean triage  ;
	
	
	// CONSTRUCTEUR DE LA FENETRE

	/**
	 * Constructeur par défaut.
	 * 
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public ClientFenetreAccueil(boolean compteSupprime)
	{	
		/*
		 * Va nous pemettre d'utiliser this.dispose pour disposer d'un fenêtre quand on en a plus besoin (pour la fermer)
		 * Ce bout de code sert à fermer la connexion avec le serveur proprement (pas de message d'erreur) lorsque l'on clique sur la croix rouge.
		 */
		this.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent arg0)
			{
				if(quitter)
				{
					ClientCommunication.getInstance().fermerConnexion();
				}
			}
		});
		
		
		this.setTitle("Petites Annonces - Accueil");
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setVisible(true);
		
		//on définit la taille de la fenêtre
		//600x660 pour respecter au mieux la taille de l'image d'accueil.
		this.setSize(600,660);

		
		//On n'empêche le redimensionnement.
		this.setResizable(false);
		
		
		//On colore le panel dans un gris sympathique et soyeux.
		grandPanel = new JPanel() ;
		grandPanel.setBackground(Color.LIGHT_GRAY);
		this.setContentPane(grandPanel);
		
		
		//BorderLayout pour agencer nos éléments.
		borderLayoutPrincipal = new BorderLayout();
		this.setLayout(borderLayoutPrincipal);
		
		
		
		//PERSONNALISATION DE LA FENETRE A PARTIR DICI 
		

		//Déclaration de notre FlowLayout
		flowLayout = new FlowLayout();
		
		
		//Association Layout <-> Panel + CENTER + couleur.
		panel = new JPanel();
		panel.setLayout(flowLayout);
		this.getContentPane().add(panel, BorderLayout.CENTER);
		panel.setBackground(Color.LIGHT_GRAY);

		
		
		// ON DISPOSE DES ELEMENTS DE NOTRE FENETRE DANS panel.
		
		//Label informatif.
		compteSuppr = new JLabel("Votre compte a bien été supprimé !");
		compteSuppr.setForeground(Color.LIGHT_GRAY);
		panel.add(compteSuppr);
		
		if(compteSupprime)
		{
			compteSuppr.setForeground(Color.RED);
		}
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide0 = new JLabel();
		espacevide0.setPreferredSize(new Dimension(350, 30));
		panel.add(espacevide0);
		
		
		//Label informatif.
		panel.add(new JLabel("Bienvenue !!   "));	
		

		//Label "login".
		JLabel label1 = new JLabel(" Login : ");
		panel.add(label1);
		
		
		//TextField correspondant au login.
		textArea = new JTextField();
		textArea.setPreferredSize(new Dimension(90, 20));
		panel.add(textArea);
		
		
		//Label "Password".
		panel.add(new JLabel("Password : "));
		
		
		//PasswordField permet de cacher les caractères tapés.
		passwordArea = new JPasswordField();
		passwordArea.setPreferredSize(new Dimension(90, 20));
		panel.add(passwordArea);
		
		
		//Boutton "Se connecter".
		seConnecter = new JButton("Se connecter");
		seConnecter.setPreferredSize(new Dimension(150, 25));
		panel.add(seConnecter);
		seConnecter.addActionListener(this);
		

		//Espace pour agencer nos éléments.
		JLabel espacevide1 = new JLabel();
		espacevide1.setPreferredSize(new Dimension(80, 30));
		panel.add(espacevide1);
		

		//Message d'erreur.
		//(par défaut de la même couleur que le fond pour le cacher)
		erreurLoginPassword = new JLabel("Login ou Password incorrect. Veuillez réessayer.");
		erreurLoginPassword.setForeground(Color.lightGray);
		panel.add(erreurLoginPassword);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide2 = new JLabel();
		espacevide2.setPreferredSize(new Dimension(20, 30));
		panel.add(espacevide2);
		
		
		//Boutton "Creer..."
		creeUnCompte = new JButton("Creer un compte");
		creeUnCompte.setPreferredSize(new Dimension(150, 25));
		creeUnCompte.addActionListener(this);
		panel.add(creeUnCompte);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide3 = new JLabel();
		espacevide3.setPreferredSize(new Dimension(410, 30));
		panel.add(espacevide3);
		

		//ComboBox contenant les options de tri.
		combo = new JComboBox();
		combo.setPreferredSize(new Dimension(180, 20));
		combo.addItem("Trier");
		combo.addItem("Date");
		combo.addItem("Département");
		combo.addItem("Offres d'Emplois/Stages");
		combo.addItem("Ventes Objets/Services");
		panel.add(combo);
		
		//on change l'option d'affichage du comboBox.
		if (triage == false)
		{
			combo.setSelectedItem(0);
		}
		
		else if (tri.equals("surDate"))
		{
			combo.setSelectedIndex(1);
		}
		
		else if (tri.equals("surDepartement"))
		{
			combo.setSelectedIndex(2);	
		}
		
		else if (tri.equals("surType") && triage_annonce_emploi)
		{
		combo.setSelectedIndex(3);
		}
		
		else if (tri.equals("surType") && triage_annonnce_objet)
		{
		combo.setSelectedIndex(4);
		}

		
		//On récupère toutes les résumés d'annonces.
		listeAnnonces = ClientCommunication.getInstance().recupererToutesAnnonces();

    	

		//ici on applique une action sur les annonces en fonction du champs choisi dans la JComboBox.
        class ItemAction implements ActionListener
        {
                public void actionPerformed(ActionEvent e) 
                {
                        System.out.println("ActionListener : action sur " + combo.getSelectedItem());

                        if (combo.getSelectedItem().equals("Trier"))
                        {
                        	triage = false ;
                        	//on rafraichit la page.
                			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreAccueil");
                			dispose();
                			triage_annonce_emploi = false ; 
                			triage_annonnce_objet = false ; 	
                        }
                        
                        if (combo.getSelectedItem().equals("Date"))
                        {
                        	triage = true ;
                        	tri = "surDate";
                        	//on rafraichit la page.
                			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreAccueil");
                			dispose();
                			triage_annonce_emploi = false ; 
                			triage_annonnce_objet = false ; 
                        }
                        if (combo.getSelectedItem().equals("Département"))
                        {
                        	triage = true ;
                        	tri = "surDepartement";
                        	//on rafraichit la page.
                			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreAccueil");
                			dispose();
                			triage_annonce_emploi = false ; 
                			triage_annonnce_objet = false ; 
                        }
                        if (combo.getSelectedItem().equals("Offres d'Emplois/Stages"))
                        {
                    			triage = true ;
                        	    tri = "surType";
                        		triage_annonce_emploi = true ; 
                        		triage_annonnce_objet = false ;
                            	//on rafraichit la page.
                    			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreAccueil");
                    			dispose();
                        }	
                        if (combo.getSelectedItem().equals("Ventes Objets/Services"))
                        {
                    		triage = true ;
                        	tri = "surType";
                    		triage_annonce_emploi = false ; 
                    		triage_annonnce_objet = true ;
                			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreAccueil");
                			dispose();
                        }	
                			
                        
                }               
        }
        
		//Ajout du listener.
        ItemAction itemAction = new ItemAction();
		combo.addActionListener(itemAction);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide4 = new JLabel();
		espacevide4.setPreferredSize(new Dimension(350, 30));
		panel.add(espacevide4);

		//On affiche le panel.
		panel.setVisible(true);


		//AFFICHAGE DES ANNONCES

		//on utilise un GridLayout pour afficher les annonces.
		gridLayoutAnnonces = new GridLayout();
		gridLayoutAnnonces.setColumns(3);
		
		int lignes = listeAnnonces.size();
		
		if(triage)
		{
			if(triage_annonce_emploi)
			{
				lignes = 0;
				
				for(ResumeAnnonceDTO r : listeAnnonces)
				{
					if(r.isObjet_service())
					{
						continue;
					}
					
					lignes++;
				}
			}
			else if(triage_annonnce_objet)
			{
				lignes = 0;
				
				for(ResumeAnnonceDTO r : listeAnnonces)
				{
					if(r.isEmploi_stage())
					{
						continue;
					}
					
					lignes++;
				}
			}
		}
		
		// On ajoute 1 car la prmière ligne contient le nom des colonnes du tableau
		gridLayoutAnnonces.setRows(lignes+1);
		

		//panel qui reçoit les panel Head1 - Head2 - Head3.
		panelIntermediaire = new JPanel();
		panelIntermediaire.setLayout(gridLayoutAnnonces);
		panelIntermediaire.setBackground(Color.LIGHT_GRAY);
		panelIntermediaire.setMaximumSize(new Dimension(400, 400));

		
		JPanel panelHead1 = new JPanel();
		panelHead1.add(new JLabel("Date"));
		panelHead1.setPreferredSize(new Dimension(180, 30));
		panelHead1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		panelHead1.setBackground(Color.LIGHT_GRAY);
		
		JPanel panelHead2 = new JPanel();
		panelHead2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		panelHead2.setBackground(Color.LIGHT_GRAY);
		panelHead2.add(new JLabel("Annonces"));
		
		JPanel panelHead3 = new JPanel();
		panelHead3.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		panelHead3.setBackground(Color.LIGHT_GRAY);
		panelHead3.add(new JLabel(""));
		
		panelIntermediaire.add(panelHead1);
		panelIntermediaire.add(panelHead2);
		panelIntermediaire.add(panelHead3);
		

		//Panel scrollable.
		scrollPanel = new JScrollPane(panelIntermediaire);
		scrollPanel.setMinimumSize(new Dimension(400, 50));
		scrollPanel.setMaximumSize(new Dimension(400, 400));
		scrollPanel.setPreferredSize(new Dimension(570, 430));
		scrollPanel.setWheelScrollingEnabled(true);
		panel.add(scrollPanel);

		
		//Panel qui va accueillir la checkBox et le bouton "Modifier" dans la troisème colonne.
		JPanel jpanel = null ; 
		JButton btn ; 

		
		//EN FONCTION DU CHOIX FAIT SUR LE COMBOBOX ON AFFICHE LA LISTE ADEQUATE.
		//si tirage vaut false on affiche la liste non classée sinon on rentre ici.
		
		List<ResumeAnnonceDTO> listeAnnonce = new ArrayList<ResumeAnnonceDTO>(listeAnnonces);
		
		if (triage == true)
		{
			//en fonction de la valeur de "tri" on affiche la liste correspondante.
			if (tri.equals("surDate"))
			{
		    	listeAnnonce = ResumeAnnonceDTO.trierParDate(listeAnnonce);

			}
			
			else if (tri.equals("surDepartement"))
			{
		    	listeAnnonce = ResumeAnnonceDTO.trierParDepartement(listeAnnonce);
			}
		}	

			
			for (ResumeAnnonceDTO resume : listeAnnonce)
			{
				if (triage_annonnce_objet)
				{
					if (resume.isEmploi_stage())
					{
					continue;
					}
				}
				else if (triage_annonce_emploi)
				{
					if (resume.isObjet_service())
					{
					continue;
					}
				}
				
					jpanel = new JPanel() ;
					jpanel.add(new JLabel(resume.getDate().toString()));
					jpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
					jpanel.setBackground(Color.LIGHT_GRAY);
					panelIntermediaire.add(jpanel);
					
					jpanel = new JPanel();
					JTextArea labelTitre = new JTextArea(resume.getTitre().toString());
					labelTitre.setLineWrap(true);
					labelTitre.setPreferredSize(new Dimension(170, 30));
					labelTitre.setEditable(false);
					labelTitre.setFocusable(false);
					labelTitre.setBackground(Color.LIGHT_GRAY);
					jpanel.add(labelTitre);
					jpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
					jpanel.setBackground(Color.LIGHT_GRAY);
					panelIntermediaire.add(jpanel);
					
					
					btn = new JButton(">");
					final int id = resume.getId();
					
					
					btn.addActionListener(new ActionListener()
					{
						public void actionPerformed(ActionEvent arg0)
						{
							ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreVoirAnnonce", id);
							dispose();
						}
					});
					jpanel = new JPanel() ; 
					jpanel.add(btn);
					panelIntermediaire.add(jpanel);
					jpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
					jpanel.setBackground(Color.LIGHT_GRAY);
				}
			

		
		//panel intermédiaire visble.
		panelIntermediaire.setVisible(true);	
	}

	
	
	// ACTIONS SUR LES BOUTONS
	
	public void actionPerformed(ActionEvent arg0)
	{
		Object event = arg0.getSource();
		
		// si on clique sur le boutton "Se connecter" alors on regarde,
		// si le login et le mdp concordent, sinon on gère l'erreur (retour -1).
		if (event == seConnecter)
		{
				int idVendeur = ClientCommunication.getInstance().connexionVendeur(textArea.getText(), new String(passwordArea.getPassword()));
				if (idVendeur == -1)
				{
					//le noyau à renvoyé -1 -> on affiche le message d'erreur.
					erreurLoginPassword.setForeground(Color.red);
				}
				else
				{
					//sinon on laisse le message caché
					erreurLoginPassword.setForeground(Color.lightGray);
					
					//on définit le vendeur avec l'ID du vendeur récupéré.
					ClientCommunication.getInstance().setVendeurStocke(ClientCommunication.getInstance().recupererVendeur(idVendeur));
					
					quitter = false;
					ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreUneFoisConnecte");
					this.dispose();
				}
		}

		//Clic sur le bouton "Créer un..."
		if (event == creeUnCompte)
		{
			quitter = false;
			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreCreerUnCompte");
			this.dispose();
		}
	}


	//Méthodes implémentées de WindowListener, on ne les utilisent pas.

	@Override
	public void windowActivated(WindowEvent e)
	{
		
	}




	@Override
	public void windowClosed(WindowEvent e)
	{
		
	}




	@Override
	public void windowClosing(WindowEvent e)
	{
		
	}




	@Override
	public void windowDeactivated(WindowEvent e)
	{
		
	}




	@Override
	public void windowDeiconified(WindowEvent e)
	{
		
	}




	@Override
	public void windowIconified(WindowEvent e)
	{
		
	}




	@Override
	public void windowOpened(WindowEvent e)
	{
		
	}

}
